/**
 * 函子:Functor
 * · 如果它有 map 方法可称为函子
 * · 函子一定有一个 of 方法，用来生成实例
 * · 函子内部会保存一个值 value
 * · 函子提供 map 方法，接入各种运算函数，从而引发值的变化
 */
class Functor {
  constructor(value) {
    this.value = value;
  }

  static of(value) {
    return new Functor(value);
  }

  map(fn) {
    return new Functor(fn(this.value));
  }
}

const functor = Functor.of(1)
  .map((x) => x + 1) // value = x=1 + 1,  此时 this.value = 2
  .map((x) => x + 2) // value = x=2 + 2， 此时 this.value = 4
  .map((x) => x + 3) // value = x=4 + 3， 此时 this.value = 7
  .map((x) => x + 4); // value = x=7 + 3， 此时 this.value = 7

console.log(functor);
